home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / comm / mail / Mutt089src.lha / Mutt-0.89i-AMIGA / src / addrbook.c < prev    next >
C/C++ Source or Header  |  1998-01-28  |  4KB  |  136 lines

  1. /*
  2.  * Copyright (C) 1996-8 Michael R. Elkins <me@cs.hmc.edu>
  3.  * 
  4.  *     This program is free software; you can redistribute it and/or modify
  5.  *     it under the terms of the GNU General Public License as published by
  6.  *     the Free Software Foundation; either version 2 of the License, or
  7.  *     (at your option) any later version.
  8.  * 
  9.  *     This program is distributed in the hope that it will be useful,
  10.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *     GNU General Public License for more details.
  13.  * 
  14.  *     You should have received a copy of the GNU General Public License
  15.  *     along with this program; if not, write to the Free Software
  16.  *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */ 
  18.  
  19. #include "mutt.h"
  20. #include "mutt_menu.h"
  21.  
  22. #include <string.h>
  23. #include <stdlib.h>
  24.  
  25. typedef struct entry
  26. {
  27.   int tagged; /* has the user already added this alias to the list? */
  28.   ALIAS *alias;
  29. } ENTRY;
  30.  
  31. int alias_search (MUTTMENU *m, regex_t *re, int n)
  32. {
  33.   ENTRY *table = (ENTRY *) m->data;
  34.  
  35.   return (regexec (re, table[n].alias->name, 0, NULL, 0));
  36. }
  37.  
  38. /* This is the callback routine from mutt_menuLoop() which is used to generate
  39.  * a menu entry for the requested item number.
  40.  */
  41. void alias_entry (char *s, size_t slen, MUTTMENU *m, int num)
  42. {
  43.   char buf[SHORT_STRING] = { 0 };
  44.   ENTRY *table = (ENTRY *) m->data;
  45.  
  46.   rfc822_write_address (buf, sizeof (buf), table[num].alias->addr);
  47.   snprintf (s, slen, "%2d %c %-10s   %s", num+1,
  48.         table[num].tagged ? '*' : ' ',
  49.         table[num].alias->name,
  50.         buf);
  51. }
  52.  
  53. int alias_tag (MUTTMENU *menu, int n)
  54. {
  55.   return (((ENTRY *) menu->data)[n].tagged = !((ENTRY *) menu->data)[n].tagged);
  56. }
  57.  
  58. static int addrbook_sort (const void *a, const void *b)
  59. {
  60.   ADDRESS *pa = ((ENTRY *) a)->alias->addr;
  61.   ADDRESS *pb = ((ENTRY *) b)->alias->addr;
  62.  
  63.   if (pa->personal)
  64.   {
  65.     if (pb->personal)
  66.       return (strcasecmp (pa->personal, pb->personal));
  67.     return (-1);
  68.   }
  69.   else if (pb->personal)
  70.     return (1);
  71.   return (strcasecmp (pa->mailbox, pb->mailbox));
  72. }
  73.  
  74. void mutt_alias_menu (char *buf, size_t buflen, ALIAS *aliases)
  75. {
  76.   ALIAS *aliasp;
  77.   MUTTMENU *menu;
  78.   ENTRY *AliasTable = NULL;
  79.   int i, done = 0;
  80.   char helpstr[SHORT_STRING];
  81.   char tmp[16];
  82.  
  83.   if (!aliases)
  84.   {
  85.     mutt_error ("You have no aliases!");
  86.     return;
  87.   }
  88.  
  89.   /* tell whoever called me to redraw the screen when I return */
  90.   set_option (OPTNEEDREDRAW);
  91.  
  92.   menu = mutt_new_menu ();
  93.   menu->make_entry = alias_entry;
  94.   menu->search = alias_search;
  95.   menu->tag = alias_tag;
  96.   menu->menu = MENU_ALIAS;
  97.   menu->title = "Aliases";
  98.  
  99.   helpstr[0] = 0;
  100.   mutt_make_help (tmp, sizeof (tmp), "Exit  ", MENU_ALIAS, OP_EXIT);
  101.   strcat (helpstr, tmp);
  102.   mutt_make_help (tmp, sizeof (tmp), "Select  ", MENU_ALIAS, OP_GENERIC_SELECT_ENTRY);
  103.   strcat (helpstr, tmp);
  104.   mutt_make_help (tmp, sizeof (tmp), "Help", MENU_ALIAS, OP_HELP);
  105.   strcat (helpstr, tmp);
  106.   menu->help = helpstr;
  107.  
  108.   /* count the number of aliases */
  109.   for (aliasp = aliases; aliasp; aliasp = aliasp->next)
  110.     menu->max++;
  111.  
  112.   menu->data = AliasTable = (ENTRY *) safe_calloc (menu->max, sizeof (ENTRY));
  113.  
  114.   for (i = 0, aliasp = aliases; aliasp; aliasp = aliasp->next, i++)
  115.     AliasTable[i].alias = aliasp;
  116.  
  117.   qsort (AliasTable, i, sizeof (ENTRY), addrbook_sort);
  118.  
  119.   while (!done)
  120.   {
  121.     switch (mutt_menuLoop (menu))
  122.     {
  123.       case OP_EXIT:
  124.     done = 1;
  125.     break;
  126.     }
  127.   }
  128.  
  129.   for (i = 0; i < menu->max; i++)
  130.     if (AliasTable[i].tagged)
  131.       rfc822_write_address (buf, buflen, AliasTable[i].alias->addr);
  132.  
  133.   mutt_menuDestroy (&menu);
  134.   safe_free ((void **) &AliasTable);
  135. }
  136.